package com.cencat.common.constants;

/**
 * 通用常量类
 * 定义系统中使用的各种常量
 * 
 * @author cencat
 * @since 2024-01-01
 */
public class CommonConstants {

    // ========== 系统常量 ==========
    
    /**
     * 系统名称
     */
    public static final String SYSTEM_NAME = "cencat-saas";
    
    /**
     * 系统版本
     */
    public static final String SYSTEM_VERSION = "1.0.0";
    
    /**
     * 默认字符编码
     */
    public static final String DEFAULT_CHARSET = "UTF-8";
    
    /**
     * 默认时区
     */
    public static final String DEFAULT_TIMEZONE = "GMT+8";
    
    /**
     * 默认日期时间格式
     */
    public static final String DEFAULT_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    
    /**
     * 默认日期格式
     */
    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    
    /**
     * 默认时间格式
     */
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
    
    // ========== 数据库常量 ==========
    
    /**
     * 逻辑删除 - 未删除
     */
    public static final Integer DELETED_NO = 0;
    
    /**
     * 逻辑删除 - 已删除
     */
    public static final Integer DELETED_YES = 1;
    
    /**
     * 状态 - 启用
     */
    public static final Integer STATUS_ENABLED = 1;
    
    /**
     * 状态 - 禁用
     */
    public static final Integer STATUS_DISABLED = 0;
    
    /**
     * 默认页码
     */
    public static final Long DEFAULT_PAGE_NUM = 1L;
    
    /**
     * 默认页面大小
     */
    public static final Long DEFAULT_PAGE_SIZE = 10L;
    
    /**
     * 最大页面大小
     */
    public static final Long MAX_PAGE_SIZE = 1000L;
    
    // ========== 缓存常量 ==========
    
    /**
     * 缓存相关常量
     */
    public static class Cache {
        /** 缓存键分隔符 */
        public static final String CACHE_KEY_SEPARATOR = ":";
        
        /** 默认缓存过期时间(秒) - 30分钟 */
        public static final long DEFAULT_EXPIRE_TIME = 1800L;
        
        /** 短期缓存过期时间(秒) - 5分钟 */
        public static final long SHORT_EXPIRE_TIME = 300L;
        
        /** 长期缓存过期时间(秒) - 24小时 */
        public static final long LONG_EXPIRE_TIME = 86400L;
        
        /** 缓存前缀 */
        public static final String CACHE_PREFIX = "cencat:";
        
        /** 用户缓存前缀 */
        public static final String USER_CACHE_PREFIX = CACHE_PREFIX + "user:";
        
        /** 商家缓存前缀 */
        public static final String MERCHANT_CACHE_PREFIX = CACHE_PREFIX + "merchant:";
        
        /** 司机缓存前缀 */
        public static final String DRIVER_CACHE_PREFIX = CACHE_PREFIX + "driver:";
        
        /** 订单缓存前缀 */
        public static final String ORDER_CACHE_PREFIX = CACHE_PREFIX + "order:";
        
        /** 配置缓存前缀 */
        public static final String CONFIG_CACHE_PREFIX = CACHE_PREFIX + "config:";
        
        /** 权限缓存前缀 */
        public static final String PERMISSION_CACHE_PREFIX = CACHE_PREFIX + "permission:";
        
        /** 验证码缓存前缀 */
        public static final String CAPTCHA_CACHE_PREFIX = CACHE_PREFIX + "captcha:";
        
        /** 短信验证码缓存前缀 */
        public static final String SMS_CODE_CACHE_PREFIX = CACHE_PREFIX + "sms:code:";
        
        /** 登录失败次数缓存前缀 */
        public static final String LOGIN_FAIL_COUNT_PREFIX = CACHE_PREFIX + "login:fail:";
    }
    
    /**
     * 路线缓存前缀
     */
    public static final String ROUTE_CACHE_PREFIX = "route";
    
    /**
     * 默认缓存过期时间（秒）
     */
    public static final Long DEFAULT_CACHE_EXPIRE = 1800L; // 30分钟
    
    /**
     * 短期缓存过期时间（秒）
     */
    public static final Long SHORT_CACHE_EXPIRE = 300L; // 5分钟
    
    /**
     * 长期缓存过期时间（秒）
     */
    public static final Long LONG_CACHE_EXPIRE = 86400L; // 24小时
    
    // ========== 请求头常量 ==========
    
    /**
     * 授权头
     */
    public static final String AUTHORIZATION_HEADER = "Authorization";
    
    /**
     * Token前缀
     */
    public static final String TOKEN_PREFIX = "Bearer ";
    
    /**
     * 租户ID头
     */
    public static final String TENANT_ID_HEADER = "X-Tenant-Id";
    
    /**
     * 用户ID头
     */
    public static final String USER_ID_HEADER = "X-User-Id";
    
    /**
     * 请求ID头
     */
    public static final String REQUEST_ID_HEADER = "X-Request-Id";
    
    /**
     * 客户端IP头
     */
    public static final String CLIENT_IP_HEADER = "X-Real-IP";
    
    // ========== 文件常量 ==========
    
    /**
     * 文件相关常量
     */
    public static class File {
        /** 最大文件大小 10MB */
        public static final long MAX_FILE_SIZE = 10 * 1024 * 1024L;
        
        /** 最大图片大小 5MB */
        public static final long MAX_IMAGE_SIZE = 5 * 1024 * 1024L;
        
        /** 图片上传路径 */
        public static final String IMAGE_UPLOAD_PATH = "/upload/images";
        
        /** 文档上传路径 */
        public static final String DOCUMENT_UPLOAD_PATH = "/upload/documents";
        
        /** 允许的图片格式 */
        public static final String[] ALLOWED_IMAGE_FORMATS = {"jpg", "jpeg", "png", "gif", "bmp", "webp"};
        
        /** 允许的文档格式 */
        public static final String[] ALLOWED_DOCUMENT_FORMATS = {"pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "txt"};
    }
    
    /**
     * 文件上传最大大小（字节）- 10MB
     */
    public static final Long MAX_FILE_SIZE = 10 * 1024 * 1024L;
    
    /**
     * 图片文件最大大小（字节）- 5MB
     */
    public static final Long MAX_IMAGE_SIZE = 5 * 1024 * 1024L;
    
    /**
     * 允许的图片文件类型
     */
    public static final String[] ALLOWED_IMAGE_TYPES = {"jpg", "jpeg", "png", "gif", "bmp", "webp"};
    
    /**
     * 允许的文档文件类型
     */
    public static final String[] ALLOWED_DOCUMENT_TYPES = {"pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "txt"};
    
    // ========== 正则表达式常量 ==========
    
    /**
     * 手机号正则表达式
     */
    public static final String MOBILE_REGEX = "^1[3-9]\\d{9}$";
    
    /**
     * 邮箱正则表达式
     */
    public static final String EMAIL_REGEX = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$";
    
    /**
     * 身份证号正则表达式
     */
    public static final String ID_CARD_REGEX = "^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";
    
    /**
     * 车牌号正则表达式
     */
    public static final String LICENSE_PLATE_REGEX = "^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-Z0-9]{4}[A-Z0-9挂学警港澳]$";
    
    /**
     * 密码强度正则表达式（至少8位，包含大小写字母和数字）
     */
    public static final String PASSWORD_REGEX = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d@$!%*?&]{8,}$";
    
    // ========== 业务常量 ==========
    
    /**
     * 默认密码
     */
    public static final String DEFAULT_PASSWORD = "123456";
    
    /**
     * 超级管理员角色代码
     */
    public static final String SUPER_ADMIN_ROLE = "SUPER_ADMIN";
    
    /**
     * 系统管理员角色代码
     */
    public static final String SYSTEM_ADMIN_ROLE = "SYSTEM_ADMIN";
    
    /**
     * 普通用户角色代码
     */
    public static final String USER_ROLE = "USER";
    
    /**
     * 商家角色代码
     */
    public static final String MERCHANT_ROLE = "MERCHANT";
    
    /**
     * 司机角色代码
     */
    public static final String DRIVER_ROLE = "DRIVER";
    
    /**
     * 默认头像
     */
    public static final String DEFAULT_AVATAR = "/static/images/default-avatar.png";
    
    /**
     * 系统用户ID（用于系统自动操作）
     */
    public static final Long SYSTEM_USER_ID = 0L;
    
    /**
     * 默认租户ID
     */
    public static final Long DEFAULT_TENANT_ID = 1L;
    
    // ========== 业务常量 ==========
    
    /**
     * 业务相关常量
     */
    public static class Business {
        /** 默认租户ID */
        public static final Long DEFAULT_TENANT_ID = 1L;
        
        /** 系统租户ID */
        public static final Long SYSTEM_TENANT_ID = 0L;
        
        /** 租户表前缀 */
        public static final String TENANT_TABLE_PREFIX = "t_";
        
        /** 默认租户表前缀 */
        public static final String DEFAULT_TABLE_PREFIX = "";
    }
    
    // ========== 系统内部类 ==========
    
    /**
     * 系统相关常量
     */
    public static class System {
        /** UTF-8字符编码 */
        public static final String CHARSET_UTF8 = "UTF-8";
        
        /** 系统换行符 */
        public static final String LINE_SEPARATOR = java.lang.System.lineSeparator();
        
        /** 系统文件分隔符 */
        public static final String FILE_SEPARATOR = java.lang.System.getProperty("file.separator");
        
        /** 系统路径分隔符 */
        public static final String PATH_SEPARATOR = java.lang.System.getProperty("path.separator");
        
        /** 临时目录 */
        public static final String TEMP_DIR = java.lang.System.getProperty("java.io.tmpdir");
        
        /** 用户主目录 */
        public static final String USER_HOME = java.lang.System.getProperty("user.home");
        
        /** 工作目录 */
        public static final String USER_DIR = java.lang.System.getProperty("user.dir");
    }
    
    // ========== 私有构造函数 ==========
    
    /**
     * 私有构造函数，防止实例化
     */
    private CommonConstants() {
        throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
    }
}